www.gusucode.com > 基于Visual C++高级界面特效制作百例源码程序 > 基于Visual C++高级界面特效制作百例源码程序/code/char05/enh_diblook/DIBStatic.cpp
///////////////////////////////////////////////////////////////////////////// // Copyright (C) 1998 by Jorge Lodos // All rights reserved // // Distribute and use freely, except: // 1. Don't alter or remove this notice. // 2. Mark the changes you made // // Send bug reports, bug fixes, enhancements, requests, etc. to: // lodos@cigb.edu.cu ///////////////////////////////////////////////////////////////////////////// // DIBStatic.cpp : implementation file // #include "stdafx.h" #include "Dib.h" #include "DIBStatic.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDIBStatic CDIBStatic::CDIBStatic() { } CDIBStatic::~CDIBStatic() { } BEGIN_MESSAGE_MAP(CDIBStatic, CStatic) //{{AFX_MSG_MAP(CDIBStatic) ON_WM_CTLCOLOR_REFLECT() ON_WM_QUERYNEWPALETTE() ON_WM_PALETTECHANGED() //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CDIBStatic::LoadDib(LPCTSTR lpszFileName) { try { CFile file(lpszFileName, CFile::modeRead); return LoadDib(file); } catch (CFileException* e) { e->Delete(); return FALSE; } } BOOL CDIBStatic::LoadDib(CFile& file) { ASSERT_VALID(this); BOOL bResult = TRUE; if (!m_DIB.Read(file)) bResult = FALSE; DoRealizePalette(FALSE); UpdateDib(); return bResult; } void CDIBStatic::ClearDib() { ASSERT_VALID(this); CClientDC dc(this); CRect rectPaint; GetClientRect(&rectPaint); rectPaint.InflateRect(-1,-1); CBrush* pBrushWhite; pBrushWhite = CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH)); dc.FillRect(&rectPaint, pBrushWhite); } void CDIBStatic::PaintDib(BOOL bDibValid) { ASSERT_VALID(this); ClearDib(); CRect PaintRect; GetClientRect(&PaintRect); PaintRect.InflateRect(-1, -1); CClientDC dc(this); if (bDibValid) { int nDestX, nDestY, nDestWidth, nDestHeight; if (m_DIB.Width() < (DWORD)PaintRect.Width() && m_DIB.Height() < (DWORD)PaintRect.Height()) { // If the image fits, just center it nDestX = PaintRect.left + (PaintRect.Width() - m_DIB.Width())/2; nDestY = PaintRect.top + (PaintRect.Height() - m_DIB.Height())/2; nDestWidth = m_DIB.Height(); nDestHeight = m_DIB.Width(); } else { // The bitmap doesn't fit, scale to fit if ((PaintRect.Width()/(float)m_DIB.Width()) <= (PaintRect.Height()/(float)m_DIB.Height())) { // Width is constraint nDestWidth = PaintRect.Width(); nDestHeight = (nDestWidth*m_DIB.Height()) / m_DIB.Width(); nDestX = PaintRect.left; nDestY = PaintRect.top + (PaintRect.Height() - nDestHeight) /2; } else { // Height is constraint nDestHeight = PaintRect.Height(); nDestWidth = (nDestHeight*m_DIB.Width()) / m_DIB.Height(); nDestX = PaintRect.left + (PaintRect.Width() - nDestWidth) /2; nDestY = PaintRect.top; } } CRect RectDest(nDestX, nDestY, nDestX+nDestWidth, nDestY+nDestHeight); CRect RectDib(0, 0, m_DIB.Width(), m_DIB.Height()); m_DIB.Paint(dc, &RectDest, &RectDib); } else { dc.MoveTo(PaintRect.TopLeft()); dc.LineTo(PaintRect.BottomRight()); dc.MoveTo(PaintRect.right, PaintRect.top); dc.LineTo(PaintRect.left, PaintRect.bottom); } return; } void CDIBStatic::UpdateDib() { ASSERT_VALID(this); PaintDib(IsValidDib()); } ///////////////////////////////////////////////////////////////////////////// // CDIBStatic message handlers HBRUSH CDIBStatic::CtlColor(CDC* pDC, UINT nCtlColor) { UpdateDib(); // TODO: Return a non-NULL brush if the parent's handler should not be called return (HBRUSH)GetStockObject(NULL_BRUSH); } BOOL CDIBStatic::OnQueryNewPalette() { return DoRealizePalette(FALSE); } void CDIBStatic::OnPaletteChanged(CWnd* pFocusWnd) { DoRealizePalette(TRUE); } BOOL CDIBStatic::DoRealizePalette(BOOL bForceBackGround) { if (IsValidDib()) { CClientDC dc(this); if (!m_DIB.m_pPalette) return FALSE; HPALETTE hPal = (HPALETTE)m_DIB.m_pPalette->m_hObject; HPALETTE hOldPalette = SelectPalette(dc, hPal, bForceBackGround); UINT nChanged = dc.RealizePalette(); SelectPalette(dc, hOldPalette, TRUE); if (nChanged == 0) // no change to our mapping return FALSE; // some changes have been made; invalidate UpdateDib(); } return TRUE; }